package JavaCode.random_records.N701_800;

public class N794_valid_tic_tac_toe_state {
    public boolean validTicTacToe(String[] board) {
        int x_cnt=0;
        int o_cnt=0;
        for (String s:board)
        {
            for (char c:s.toCharArray())
            {
                if(c=='X')x_cnt++;
                else if(c=='O')o_cnt++;
            }
        }
        if(o_cnt>x_cnt||x_cnt-o_cnt>1)return false;
        boolean[] flag=new boolean[2];
        for (int i=0;i<3;i++)
        {
            if(help2(flag,board[i]))return false;
            if(help2(flag,board[0].charAt(i)+""+board[1].charAt(i)+board[2].charAt(i)))return false;
        }
        if(help2(flag,board[0].charAt(0)+""+board[1].charAt(1)+board[2].charAt(2)))return false;
        if(help2(flag,board[0].charAt(2)+""+board[1].charAt(1)+board[2].charAt(2)))return false;
        if(flag[0]&&x_cnt<=o_cnt)return false;
        if(flag[1]&&o_cnt<x_cnt)return false;
        return true;

    }

    private boolean help2(boolean[] flag, String s) {
        if(help(s)==0)return false;
        if(help(s)==1)
        {
            flag[0]=true;
        }
        else
        {
            flag[1]=true;
        }
        if(flag[0]&&flag[1])return true;
        return false;
    }


    private int help(String s) {
        if(s.charAt(0)==' ')return 0;
        if(s.charAt(0)==s.charAt(1)&&s.charAt(1)==s.charAt(2))
        {
            if(s.charAt(0)=='X')return 1;
            if(s.charAt(0)=='O')return 2;
        }
        return 0;
    }
}
/**
 * 用字符串数组作为井字游戏的游戏板 board。当且仅当在井字游戏过程中，玩家有可能将字符放置成游戏板所显示的状态时，才返回 true。
 *
 * 该游戏板是一个 3 x 3 数组，由字符 " "，"X" 和 "O" 组成。字符 " " 代表一个空位。
 *
 * 以下是井字游戏的规则：
 *
 * 玩家轮流将字符放入空位（" "）中。
 * 第一个玩家总是放字符 “X”，且第二个玩家总是放字符 “O”。
 * “X” 和 “O” 只允许放置在空位中，不允许对已放有字符的位置进行填充。
 * 当有 3 个相同（且非空）的字符填充任何行、列或对角线时，游戏结束。
 * 当所有位置非空时，也算为游戏结束。
 * 如果游戏结束，玩家不允许再放置字符。
 * 示例 1:
 * 输入: board = ["O  ", "   ", "   "]
 * 输出: false
 * 解释: 第一个玩家总是放置“X”。
 *
 * 示例 2:
 * 输入: board = ["XOX", " X ", "   "]
 * 输出: false
 * 解释: 玩家应该是轮流放置的。
 *
 * 示例 3:
 * 输入: board = ["XXX", "   ", "OOO"]
 * 输出: false
 *
 * 示例 4:
 * 输入: board = ["XOX", "O O", "XOX"]
 * 输出: true
 * 说明:
 *
 * 游戏板 board 是长度为 3 的字符串数组，其中每个字符串 board[i] 的长度为 3。
 *  board[i][j] 是集合 {" ", "X", "O"} 中的一个字符。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/valid-tic-tac-toe-state
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
